# -*- coding: iso-8859-1 -*-
# file Sensor.py
# author Rocco Martino
#
############################################################################
#    Copyright (C) 2015 by Rocco Martino                                   #
#    martinorocco@gmail.com                                                #
#                                                                          #
#    This program is free software; you can redistribute it and/or modify  #
#    it under the terms of the GNU Lesser General Public License as        #
#    published by the Free Software Foundation; either version 2.1 of the  #
#    License, or (at your option) any later version.                       #
#                                                                          #
#    This program is distributed in the hope that it will be useful,       #
#    but WITHOUT ANY WARRANTY; without even the implied warranty of        #
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         #
#    GNU Lesser General Public License for more details.                   #
#                                                                          #
#    You should have received a copy of the GNU Lesser General Public      #
#    License along with this program; if not, write to the                 #
#    Free Software Foundation, Inc.,                                       #
#    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             #
############################################################################

############################################################################
from . import Object
############################################################################




############################################################################
# ........................................................................ #
# ........................................................................ #
############################################################################




############################################################################
# ........................................................................ #
class Sensor(Object.Object):





############################################################################
    Object = None
############################################################################









############################################################################
    def __init__(self, obj, data, sensor):
        super(Sensor, self).__init__(sensor, data)

        self.Object = obj ;

        self.ClassName = "ooGame::Sensor"
        self.Name = sensor.name + "@" + obj.name
        self.CollectProps = False
        self.CheckUniqueID = True
        self.UseObjectName = False
############################################################################




############################################################################
    def writeData(self, writer):
        super(Sensor, self).writeData(writer)

        if self.BlenderObject.invert:
            writer.writeLine("Invert TRUE")

        if self.BlenderObject.use_level:
            writer.writeLine("Level TRUE")

        if self.BlenderObject.use_tap:
            writer.writeLine("Tap TRUE")





        num_controllers = 0 ;

        for i in self.BlenderObject.controllers:
            if i:
                num_controllers += 1




        if self.BlenderObject.controllers:

            writer.moveIn("ControllerList %d" % num_controllers)


            for c in self.BlenderObject.controllers:
                if c:
                    writer.writeLine("%u " % self.Object.game.controllers.find(c.name))


            writer.moveOut("ControllerList %d" % num_controllers)
############################################################################




# ........................................................................ #
############################################################################














############################################################################
# ........................................................................ #
class AlwaysSensor(Sensor):





############################################################################
    def __init__(self, obj, data, sensor):
        super(AlwaysSensor, self).__init__(obj, data, sensor)

        self.ClassName = "ooGame::AlwaysSensor"
############################################################################




# ........................................................................ #
############################################################################














############################################################################
# ........................................................................ #
class CollisionSensor(Sensor):





############################################################################
    def __init__(self, obj, data, sensor):
        super(CollisionSensor, self).__init__(obj, data, sensor)

        self.ClassName = "ooGame::CollisionSensor"
############################################################################




# ........................................................................ #
############################################################################














############################################################################
# ........................................................................ #
class MouseSensor(Sensor):





############################################################################
    def __init__(self, obj, data, sensor):
        super(MouseSensor, self).__init__(obj, data, sensor)

        self.ClassName = "ooGame::MouseSensor"
############################################################################




############################################################################
    def writeData(self, writer):
        super(MouseSensor, self).writeData(writer)

        diz = {}

        diz["LEFTCLICK"]    = "LEFT_BUTTON"
        diz["MIDDLECLICK"]  = "MIDDLE_BUTTON"
        diz["RIGHTCLICK"]   = "RIGHT_BUTTON"
        diz["MOUSEOVER"]    = "MOUSE_OVER"
        diz["MOVEMENT"]     = "MOTION"


        writer.writeLine("Event %s" % diz[self.BlenderObject.mouse_event])
############################################################################




# ........................................................................ #
############################################################################














############################################################################
# ........................................................................ #
class PropertySensor(Sensor):





############################################################################
    def __init__(self, obj, data, sensor):
        super(PropertySensor, self).__init__(obj, data, sensor)

        p = self.Data.ODEObjects[obj][1]

        if p:
            p = p.getUserValue( self.BlenderObject.property )[2]

        self.ClassName = "ooGame::%sPropertySensor" %p
############################################################################




############################################################################
    def writeData(self, writer):
        super(PropertySensor, self).writeData(writer)

        p = self.Data.ODEObjects[self.Object][1]

        if p:
            p = p.getUserValue( self.BlenderObject.property )



        if not p:
            return



        valueType = p[2]
        evaluationType = self.BlenderObject.evaluation_type.replace("PROP", "").replace("THAN", "_THAN")
        prop = self.BlenderObject.property
        value = self.BlenderObject.value
        valueMin = self.BlenderObject.value_min
        valueMax = self.BlenderObject.value_max
        prevRhs = self.BlenderObject.value



        if not value:
            value = '0'

        if not valueMin:
            valueMin = '0'

        if not valueMax:
            valueMax = '0'

        if not prevRhs:
            prevRhs = '0'


        if valueType == "Bool":
            if value.lower().split() in [["1"], ["true"], ["on"]]:
                value = "TRUE"
            else:
                value = "FALSE"

            if valueMin.lower().split() in [["1"], ["true"], ["on"]]:
                valueMin = "TRUE"
            else:
                valueMin = "FALSE"

            if valueMax.lower().split() in [["1"], ["true"], ["on"]]:
                valueMax = "TRUE"
            else:
                valueMax = "FALSE"




            prevRhs = value






        writer.writeLine("EvaluationType %s" % evaluationType)
        writer.writeLine("Property \"%s\"" % prop)



        writer.writeLine("Values")

        indentation = " " * writer.IndentationSize

        writer.writeLine(indentation + "Value %s" % value)
        writer.writeLine(indentation + "Min %s" % valueMin)
        writer.writeLine(indentation + "Max %s" % valueMax)
        writer.writeLine(indentation + "PrevRhs %s" % prevRhs)
############################################################################




# ........................................................................ #
############################################################################














############################################################################
# ........................................................................ #
class NearSensor(Sensor):





############################################################################
    def __init__(self, obj, data, sensor):
        super(NearSensor, self).__init__(obj, data, sensor)

        self.ClassName = "ooGame::NearSensor"
############################################################################




############################################################################
    def writeData(self, writer):
        super(NearSensor, self).writeData(writer)


        writer.writeLine("Distance %f" % self.BlenderObject.distance)
        writer.writeLine("ResetDistance %f" % self.BlenderObject.reset_distance)
        writer.writeLine("Property \"%s\"" % self.BlenderObject.property)
############################################################################




# ........................................................................ #
############################################################################














############################################################################
# ........................................................................ #
class DelaySensor(Sensor):





############################################################################
    def __init__(self, obj, data, sensor):
        super(DelaySensor, self).__init__(obj, data, sensor)

        self.ClassName = "ooGame::DelaySensor"
############################################################################




############################################################################
    def writeData(self, writer):
        super(DelaySensor, self).writeData(writer)


        writer.writeLine("Delay %f" % self.BlenderObject.delay)
        writer.writeLine("Duration %f" % self.BlenderObject.duration)

        if self.BlenderObject.use_repeat:
            writer.writeLine("Repeat TRUE")
        else:
            writer.writeLine("Repeat FALSE")
############################################################################




# ........................................................................ #
############################################################################














############################################################################
# ........................................................................ #
class RandomSensor(Sensor):





############################################################################
    def __init__(self, obj, data, sensor):
        super(RandomSensor, self).__init__(obj, data, sensor)

        self.ClassName = "ooGame::RandomSensor"
############################################################################




############################################################################
    def writeData(self, writer):
        super(RandomSensor, self).writeData(writer)

        threshold = 0.5

        writer.writeLine("Threshold %f" % threshold)
############################################################################




# ........................................................................ #
############################################################################














############################################################################
# ........................................................................ #
class KeyboardSensor(Sensor):





############################################################################
    def __init__(self, obj, data, sensor):
        super(KeyboardSensor, self).__init__(obj, data, sensor)

        self.ClassName = "ooGame::KeyboardSensor"
############################################################################




############################################################################
    def writeData(self, writer):
        super(KeyboardSensor, self).writeData(writer)


        writer.writeLine("Key 0x%x" % ord( self.BlenderSensor.key.lower() ))
############################################################################




# ........................................................................ #
############################################################################














############################################################################
# ........................................................................ #
class MessageSensor(Sensor):





############################################################################
    def __init__(self, obj, data, sensor):
        super(MessageSensor, self).__init__(obj, data, sensor)

        self.ClassName = "ooGame::MessageSensor"
############################################################################




############################################################################
    def writeData(self, writer):
        super(MessageSensor, self).writeData(writer)

        mtype = "TEXT"
        msubject = self.BlenderObject.subject

        writer.writeLine("Type %s" % mtype)
        writer.writeLine("Subject \"%s\"" % msubject)
############################################################################




# ........................................................................ #
############################################################################
